#include "Header.h"

// 1.socket   建立套接字文件
// 2.connect() 请求连接
// 3.read/write  send/recv
// 4.shutdown()

// 服务端先接再发
// 客户端先发再收
int flg = 0; // 私聊标志,置1为私聊

void display(char chat[][256], char *name) // 聊天界面
{

    time_t tm1 = 0;
    char *timstr = NULL;
    tm1 = time(NULL);
    timstr = asctime(localtime(&tm1));

    printf("\033[33m\033[33m-----------------------Uzoo聊天室-------------------------\n");
    printf("\033[33m\033[31m            %s\n", timstr);
    int k = 0;
    int i;
    for (i = 0; i < 19 + k; i++)
    {
        if (strlen(chat[i]) != 0)
        {
            if (strstr(chat[i], "加入了聊天室") != NULL || strstr(chat[i], "退出了聊天室") != NULL)
            {
                printf("\033[33m\033[32m%s", chat[i]);
            }
            else if (strstr(chat[i], "悄悄的对你说") != NULL || strstr(chat[i], "你悄悄的对") != NULL)
            {
                printf("\033[33m\033[35m%s", chat[i]);
                // k++;
                printf("\n");
            }
            else
            {
                printf("\033[33m\033[37m%s", chat[i]);
            }
        }
        else
            printf("\n");
    }
    printf("\033[33m\033[33m---------------------------------------------------------\n");
    printf("\033[33m\033[31m%s>>:", name);
    fflush(stdout);
    sleep(1);
}

// main
int main(int argc, char **argv)
{
    if (argc < 3)
    {
        perror("使用: ./ran + 服务器IP地址 + 服务器端口号\n");
        return -1;
    }
    int ret = 0;
    // 1建立套接字：客户端只有一个套接字。就是cid，把客户端cid与对面的绑定在一起。
    int tcp_client = socket(AF_INET, SOCK_STREAM, 0);
    if (tcp_client < 0)
    {
        perror("socket error\n");
        return -1;
    }

    // 链接服务器，把对面的地址和端口号包装起来
    struct sockaddr_in IPV4;
    memset(&IPV4, 0, sizeof(IPV4));
    IPV4.sin_family = AF_INET;
    IPV4.sin_port = htons(atoi(argv[2]));
    IPV4.sin_addr.s_addr = inet_addr(argv[1]);

    // 2.建立链接 --- 连接的是主机的，服务器的ip和端口号
    ret = connect(tcp_client, (struct sockaddr *)&IPV4, sizeof(IPV4));
    if (ret < 0)
    {
        printf("连接失败..\n");
    }

    // select函数
    fd_set rset = {0};
    struct timeval tm = {0};
    int count = 0;
    int len = 0;
    char recvbuf[256];
    char sendbuf[256];
    // 聊天记录
    int i = 0, j = 0;
    char chat[20][256] = {0};
    // 与对面建立连接以后，就开始发送数据

    // 输入名字
    char name[16] = "";

    printf("请输入你在聊天室中的名字：");
    scanf("%s", name);
    send(tcp_client, name, strlen(name), 0); // 发送名字到服务器
    system("clear");                         // 清空终端屏幕（Unix/Linux系统）
    // 打印花纹衬托的"welcome"字样
    printf("\n\n");
    printf("\n\n");
    printf("\n\n");
    printf("\n\n");
    printf("    ██╗    ██╗  ███████╗  ██╗      ███████╗   ██████╗  ███╗   ███╗   ███████╗     \n");
    printf("    ██║    ██║  ██╔════╝  ██║      ██╔════╝  ██╔═══██╗ ████╗ ████║   ██╔════╝     \n");
    printf("    ██║ █╗ ██║  █████╗    ██║      ██║       ██║   ██║ ██╔████╔██║   █████╗       \n");
    printf("    ██║███╗██║  ██╔══╝    ██║      ██║       ██║   ██║ ██║╚██╔╝██║   ██╔══╝       \n");
    printf("    ╚███╔███╔╝  ███████╗  ███████╗ ███████╗  ╚██████╔╝ ██║ ╚═╝ ██║   ███████╗     \n");
    printf("     ╚══╝╚══╝   ╚══════╝  ╚══════╝ ╚══════╝   ╚═════╝  ╚═╝     ╚═╝   ╚══════╝     \n");
    printf("\n\n");
    printf("                            欢迎来到Uzoo聊天室                                     \n");
    printf("\n\n");
    printf("                  文明聊天，从我做起，让智慧的光芒照亮每个角落                       \n");
    // 增加一些延迟以显示效果
    usleep(2000000); // 暂停1秒

    // sleep(1);

    // 3.处理聊天数据
    while (ret >= 0)
    {
        FD_SET(STDIN_FILENO, &rset);
        FD_SET(tcp_client, &rset);
        tm.tv_sec = 5;
        count = select(tcp_client + 1, &rset, NULL, NULL, &tm);
        // printf("count : %d\n",count);

        /******     收      *******/
        if (FD_ISSET(tcp_client, &rset))
        {
            memset(recvbuf, 0, 256);
            recv(tcp_client, recvbuf, 256, 0);
            if (i < 18)
            {
                strcpy(chat[i], recvbuf);
                i++;
            }
            else
            {
                int j;
                for (j = 0; j < 17; j++)
                {
                    strcpy(chat[j], chat[j + 1]);
                }
                strcpy(chat[j], recvbuf);
            }
            // printf("%s\n",recvbuf);
            display(chat, name);
        }

        // 发送数据
        if (FD_ISSET(STDIN_FILENO, &rset))
        {
            memset(sendbuf, 0, 256);
            read(STDIN_FILENO, sendbuf, sizeof(sendbuf)); // 把数据从外存文件写到内存中
            send(tcp_client, sendbuf, strlen(sendbuf), 0);
            if (strncasecmp(sendbuf, "exit", 4) == 0)
            {
                break;
            }
        }
        if (ret < 0)
            break;
    }
}
